The +O Selftest for Crackers
LordByte Cracking Challange version 1.0
Tutorial (v1.0) by Lucifer48 [Immortal Descendants]
(12 Ao√t 1999)
Contents:
Introduction
Very Very Easy
Very Easy
Easy
Not Entirely Easy
Somewhat Harder
Hard
Introduction:
Je n'ai rΘsolu que 5 tests sur 7, (Not Entirely Easy & Very Hard). Ce dernier est carrΘment un
truc de fou, il est Θnorme, j'ai abandonnΘ (je doute que quelqu'un soit assez courageux pour
rΘsourdre τa !). Quand α l'autre c'est une brute force α 9 caractΦres donc τa prend du temps...
Si vous avez des infos: d'autres combinaisons (pour Hard), word du (Not Entirely Easy) ou la
pass-phrase (Very Hard), ou autre chose qui est susceptible de faire avancer ce tut; Θcrivez moi α
lucifer48@yahoo.com. Je serais ravi d'updater ce tutorial.
Very Very Easy:
C'est une simple comparaison...
XXXX:0043B032 LEA EDX,[EBP-04] ;[EBP-04] va contenir l'adresse du serial
XXXX:0043B035 MOV EAX,[EBX+00000258]
XXXX:0043B03B CALL 0041AED4 ;lit le serial
XXXX:0043B040 MOV EAX,[EBP-04] ;notre serial
XXXX:0043B043 MOV EDX,0043B09C ;button
XXXX:0043B048 CALL 00403A44 ;comparaison
XXXX:0043B04D JNZ 0043B05B ;jump = bad cracker!
What word am I thinking of ? button
Very Easy:
Allons y...
XXXX:0043B1D7 CALL 0041AED4 ;lecture du nom
XXXX:0043B1DC MOV EAX,[EBP-08] ;mon nom
XXXX:0043B1DF CALL 00403934
XXXX:0043B1E4 MOV EBX,EAX ;contient la taille du nom
XXXX:0043B1E6 TEST EBX,EBX ;a t'on rentrΘ un nom ?
XXXX:0043B1E8 JLE 043B20E
XXXX:0043B1EA MOV ESI,00000001
XXXX:0043B1EF LEA EDX,[EBP-08] ;va contenir l'adresse du nom..
XXXX:0043B1F2 MOV EAX,[EBP-04] ;alors qu'elle est dΘjα lα...
XXXX:0043B1F5 MOV EAX,[EAX+00000280] ;qu'il est con ce delphi ;)
XXXX:0043B1FB CALL 0041AED4 ;lecture du nom (encore...)
XXXX:0043B200 MOV EAX,[EBP-08] ;d EAX: mon nom
XXXX:0043B203 MOVZX EAX,BYTE PTR [ESI+EAX-01] ;charge le ESI Φme caractΦre du nom
XXXX:0043B208 ADD EDI,EAX ;EDI vaut initialement: 031422DD
XXXX:0043B20A INC ESI ;caractΦre suivant
XXXX:0043B20B DEC EBX
XXXX:0043B20C JNZ 0043B1EF ;boucle
Cette modeste boucle additionne donc la valeur ascii de chaque caractΦre du nom, + 031422DD,
ce qui donne un joli checksum sur 32 bits. Un peu plus loin...
XXXX:0043B228 CALL 00406870 ;lecture du serial
XXXX:0043B22D MOV EAX,[EBP-08] ;d EAX: mon serial
XXXX:0043B230 CALL 00406870 ;conversion hΘxadΘcimale (rΘsultat en EAX)
XXXX:0043B235 CMP EDI,EAX ;comparaison
XXXX:0043B237 JNZ 0043B245 ;faut que τa soit Θgal!
Pour mon nom j'obtiens:
31422DDh + 4Ch + 75h + 63h + 69h + 66h + 65h + 72h + 34h + 38h = 3142613h
et deplus, 3142613h = 51652115d donc...
Name/ Lucifer48
Serial/ 51652115
A noter que ce genre de protection peut Ωtre rencontrΘ dans de nombreux sharewares.
Easy:
Bien qu'on soit autorisΘ α patcher, je ne le ferais pas... On veut devenir est VRAIs crackers
oui ou non ? A l'issu d'une boucle, on aboutit a quelques (2 en fait) comparaisons:
XXXX:0043B3FA CMP ESI,00003810
XXXX:0043B400 JNZ 0043B40A
XXXX:0043B402 CMP EBX,402A4FE7
XXXX:0043B408 JZ 0043B424
...
XXXX:0043B424 MOV EAX,EBX ;on est sur que EBX=402A4FE7
XXXX:0043B426 SUB EAX,ESI ;et que ESI=00003810 donc...
XXXX:0043B428 CMP EAX,402A17D7 ;le test est forcΘment vΘrifiΘ !
XXXX:0043B42D JZ 0043B449 ;donc ici JZ = JMP
...
XXXX:0043B449 MOV EAX,EBX ;encore une fois, on est sur que EBX=402A4FE7
XXXX:0043B44B ADD EAX,EAX ;402A4FE7 + 402A4FE7 = 80549FEC
XXXX:0043B44D LEA EDX,[ESI*2+ESI] ;ESI=00003810 donc 3*ESI=00007020
XXXX:0043B450 ADD EAX,EDX ;80549FEC + 00007020 = 805547FE
XXXX:0043B452 CMP EAX,805547FE
XXXX:0043B457 JZ 0043B473 ;ici encore, JZ = JMP
Passons maintenant α ce que fait la boucle. La boucle la plus interne fait la chose suivante:
Posons Xk le k-Φme caractΦre du serial, EDI faut initialement 1 et il s'itΦre jusqu'α la longueur
du serial.
ESI= Xk + ESI + EDI
EBX= (2*EBX XOR ESI) + ESI MOD EDI + 1
Supposons que le serial fait n caractΦres, je note X1, X2, ..., Xk, ..., Xn les caratΦres
du serial.
A la fin de la boucle (interne):
ESI = (1 + 2 + ... + n ) + X1 + X2 + ... + Xn
= n*(n+1)/2 + Sigma(1,n,k) Xk (k est l'indice de boucle qui varie de 0 α n)
Sachant que la deuxiΦme boucle (la plus externe), rΘpΦte simplement 10h fois la boucle interne,
alors, on peut calculer ESI final (celui qui va Ωtre comparΘ).
ESI (final)= 8*n*(n+1) + 16*Sigma(1,n,k) Xk
Et on sait que ESI doit valoir 00003810, et que 00003810 / 10h = 381
donc conclusion: 381h = n*(n+1)/2 + Sigma(1,n,k) Xk (*)
(*) Cette equation va donc beaucoup nous aider pour notre brute force attack (α vrai dire, je vois
pas d'autres mΘthodes !) τa va en effet enlever pas mal de possibilitΘs.
XXXX:0043B3F0 DEC DWORD PTR [EBP-0C]
XXXX:0043B3F3 JNZ 0043B3C3 ;boucle interne
XXXX:0043B3F5 DEC DWORD PTR [EBP-08]
XXXX:0043B3F8 JNZ 0043B39E ;boucle externe
Remarque: En effectuant un rapide calcul, on peut prΘsentir que le serial (le word) fait 8
caractΦres de long. En effet:
7 chars: 381h-1Ch = 365h et 365h / 7 = 7Ch (moyenne des valeurs ascii des caractΦres)
8 chars: 381h-24h = 35Dh et 35Dh / 8 = 6Bh
9 chars: 381h-2Dh = 354h et 354h / 9 = 5Eh
On devine aussi que le word se terminera par une lettre e, un peu de brute force (voir ma
source en asm), et on obtient:
What word am I thinking of ? firmware
Not Entirely Easy:
Ce test est excatement le mΩme (α deux instructions prΦs) que le prΘcΘdent.
XXXX:0043B593 MOV EAX,ESI
XXXX:0043B595 CDQ
XXXX:0043B596 IDIV EDI ;EDI varie de 1 α longueur-du-serial
XXXX:0043B598 ADD EDX,03
XXXX:0043B59B SUB EBX,EDX
XXXX:0043B59D INC EDI
XXXX:0043B59E DEC DWORD PTR [EBP-0C] ;boucle interne
XXXX:0043B5A1 JNZ 0043B56F
XXXX:0043B5A3 DEC DWORD PTR [EBP-08] ;16 boucles (comme le test prΘcΘdent)
XXXX:0043B5A6 JNZ 0043B54A
XXXX:0043B5A8 CMP ESI,00004100
XXXX:0043B5AE JNZ 0043B5B8
XXXX:0043B5B0 CMP EBX,F61D4A8F
XXXX:0043B5B6 JZ 0043B5D2 ;jmp = good cracker!
Comme ci-dessus voilα les deux formules:
ESI= Xk + ESI + EDI
EBX= (2*EBX XOR ESI) - ESI MOD EDI - 3
Vous voyez c'est pas trΦs diffΘrent ! Et comme ci-dessus, on va se reservir de ca:
410h = n*(n+1)/2 + Sigma(1,n,k) Xk pour Θcarter des possibilitΘs.
On devine (on espΦre...) que le word est en minuscules.
7 chars: 410h-1Ch = 3F4h et 3F4h / 7 = 90h (ca fait beaucoup...)
8 chars: 410h-24h = 3ECh et 3ECh / 8 = 7Dh (c'est trop aussi)
9 chars: 410h-2Dh = 3E3h et 3E3h / 9 = 6Eh <--- ca devrait aller
A chars: 410h-37h = 3D9h et 3D9h / A = 62h (trop petit ci c'est que des minuscules)
EspΘrons que le serial face bien 9 caractΦres...
Je vois pas d'autres solutions ici que la brute force dommage (voir source).
Somewhat Harder:
Grace W32Dasm et aux Strings Refs, (en particulier α "Correct Key ! ..."), on peut mettre un bpx
au bon endroit.
XXXX:0043B8CF CALL 00403B38
XXXX:0043B8D4 MOV EAX,[EBP-04]
XXXX:0043B8D7 CALL 00406870 ;EAX contient la valeur du slide
XXXX:0043B8DC IMUL EBX,EAX,000DEAAD
...
Soient X1, X2, ..., X8 les valeurs des 8 slides. Que fait ce test:
- Pour EBX: (X6*DEAAD + X3*4EF8F) XOR (X4*C94CD) XOR (X7*43421h) == 620D34h
- Pour ESI: ( ((X2*8AF) XOR (X8*8A040)) + (X1*674E8) ) XOR (X5*97AC5) == C366F9h
Deux fois, quatres inconnus (seulement), trop facile...
Voir source en pascal, qui donne la solution:
86257479
Key Status: Valid !!!!!
Hard:
Comme pour le test prΘcΘdent, W32Dasm nous aide α trouver l'adresse pour mettre un bpx.
XXXX:0043BB7F MOV EDI,39F51B20
XXXX:0043BB84 MOV DWORD PTR [ESP],118DF6E7
XXXX:0043BB8B MOV ESI,202937CD
XXXX:0043BB90 MOV EBP,6FB25085
XXXX:0043BB95 MOV EAX,[EBX+00000398] ;A1
XXXX:0043BB9B CALL 00430398 ;la case est-elle cochΘe ? (al=01=case cochΘe)
XXXX:0043BBA0 TEST AL,AL
XXXX:0043BBA2 JZ 0043BBC3 ;saut vers le test suivant
En fait le crackme parcourt toutes les cases et vΘrifie si elles sont cochΘes, si c'est le cas
alors les valeurs (EDI, ESI, EBP, DWORD PTR [ESP) subissent des modifications (opΘrations
arithmΘtiques, sar, ...), et α la fin, on teste de la faτon suivante:
XXXX:0043C260 SUB EDI,[ESP]
XXXX:0043C263 ADD ESI,EDI
XXXX:0043C265 ADD EBP,ESI
XXXX:0043C267 CMP EBP,76651C4D
XXXX:0043C26D JNZ 0043C2D0 ;no jump = good cracker!
C'est assez original, je trouve. Encore une fois, la brute force va nous aider!
(heureusement les tests des cases sont effectuΘes dans l'ordre). Il y 39 cases, τa fait 2^39
possibilitΘs (τa fait beaucoup). Toutes les sΘquences d'intructions qui suivent les tests des
cases se ressemblent α peu prΦs toutes sauf trois: A4, C4 et C13.
Avec ma source en asm (j'espΦre qu'il n'y a pas d'erreurs dedans....), voilα la premiΦre bonne
combinaison que j'ai trouvΘe:
X X X O X O O O O X O O X
O O X X X O X O X X O X O
X X O X X O O O O O O O O
Remarque: Pour information j'ai essayΘ toutes les combinaisons de A1 α C7 (C8, C9, ..., C13 non
cochΘ), il n'y a donc qu'une unique solution dans cet intervalle.
Greetings: All ID members (Volatility, Torn@do, ...), Eternal Bliss, ACiD BuRN, LaZaRuS, Duelist, ...
(c) Lucifer48. All rights reversed